package com.hb.trade.server.project.portal.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hb.core.pojo.parent.PageResult;
import com.hb.core.pojo.project.portal.dto.PortalNoticeDTO;
import com.hb.core.pojo.project.portal.entity.PortalNotice;
import com.hb.core.pojo.project.portal.entity.PortalNoticeContent;
import com.hb.core.pojo.project.portal.entity.PortalNoticeFile;
import com.hb.core.pojo.project.portal.enums.NoticeTypeEnum;
import com.hb.core.pojo.project.portal.mapper.PortalNoticeContentMapper;
import com.hb.core.pojo.project.portal.mapper.PortalNoticeFileMapper;
import com.hb.core.pojo.project.portal.mapper.PortalNoticeMapper;
import com.hb.trade.server.project.portal.service.PortalNoticeService;
import com.hb.trade.server.project.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.fzzn.core.util.IdUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 门户公告 服务实现类
 * </p>
 *
 * @author tian
 * @since 2022-05-25
 */
@Slf4j
@Service
public class PortalNoticeServiceImpl extends ServiceImpl<PortalNoticeMapper, PortalNotice> implements PortalNoticeService {

    @Autowired
    private PortalNoticeContentMapper portalNoticeContentMapper;
    @Autowired
    private PortalNoticeFileMapper portalNoticeFileMapper;

    /**
     * 添加门户的附件
     *
     * @param portalNoticeDTO
     * @return boolean
     * @author tian
     * @date 2022-5-25 18:43
     */
    @Override
    public boolean savePortalNotice(PortalNoticeDTO portalNoticeDTO) {
        try {
            PortalNotice portalNotice = new PortalNotice();
            portalNoticeDTO.to(portalNotice);

            // 保存公告信息
            Long portalNoticeId = IdUtil.getId();
            portalNotice.setId(portalNoticeId);
            baseMapper.insert(portalNotice);

            // 保存公告内容
            PortalNoticeContent portalNoticeContent = new PortalNoticeContent();
            portalNoticeContent.setId(IdUtil.getId());
            portalNoticeContent.setPortalNoticeId(portalNoticeId);
            portalNoticeContent.setNoviceContent(portalNoticeDTO.getNoviceContent());
            portalNoticeContentMapper.insert(portalNoticeContent);


            // 保存公告附件
            if (CollUtil.isNotEmpty(portalNoticeDTO.getPortalNoticeFileList())) {
                for (PortalNoticeFile portalNoticeFile : portalNoticeDTO.getPortalNoticeFileList()) {
                    portalNoticeFile.setId(IdUtil.getId());
                    portalNoticeFile.setPortalNoticeId(portalNoticeId);
                    portalNoticeFileMapper.insert(portalNoticeFile);
                }
            }
            return true;
        } catch (Exception e) {
            log.error("同步门户数据失败 , mes is [{}]", e.getMessage(), e);
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @param portalNoticeDTO
     * @return org.fzzn.core.model.msg.Message<com.hb.core.pojo.parent.PageResult < com.hb.core.pojo.portal.entity.PortalNotice>>
     * @Description: 门户公告查询
     * @author yuezheng
     * @date 2022/5/26 13:43
     */
    @Override
    public PageResult<PortalNotice> pagePortalNoticeList(PortalNoticeDTO portalNoticeDTO) {

        Page<PortalNotice> pages = portalNoticeDTO.pages();
        Page<PortalNotice> page = null;

        SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        try {
            if (null != portalNoticeDTO.getPublishStartDate()) {
                Date publishStartDate = simpleDateFormat.parse(sim.format(portalNoticeDTO.getPublishStartDate()) + " 00:00:00");
                portalNoticeDTO.setPublishStartDate(publishStartDate);
            }
            if (null != portalNoticeDTO.getPublishEndDate()) {
                Date publishEndDate = simpleDateFormat.parse(sim.format(portalNoticeDTO.getPublishEndDate()) + " 23:59:59");
                portalNoticeDTO.setPublishEndDate(publishEndDate);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        // 招标
        if (portalNoticeDTO.getNoticeType().equals(NoticeTypeEnum.TENDER.getCode())) {
            page = baseMapper.listByTenderNotice(pages,portalNoticeDTO);
        }

        // 中标候选人/中标结果
        if (portalNoticeDTO.getNoticeType().equals(NoticeTypeEnum.BID_CANDIDATE.getCode())) {
            page = baseMapper.listByWinningBidNotice(pages,portalNoticeDTO);
        }

        // 变更
        if (portalNoticeDTO.getNoticeType().equals(NoticeTypeEnum.BID_RESULT.getCode())) {
            page = baseMapper.listByChangeNotice(pages,portalNoticeDTO);
        }

        if (CollUtil.isNotEmpty(page.getRecords())) {
            for (PortalNotice portalNotice : page.getRecords()) {
                if (portalNotice.getOpenBidTime() != null) {
                    if (DateUtil.getMillis2() > portalNotice.getOpenBidTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()) {
                        portalNotice.setApplyStatus(2);
                    } else {
                        portalNotice.setApplyStatus(1);
                    }
                } else {
                    portalNotice.setApplyStatus(2);
                }
            }
        }
        return PageResult.get(page);
    }

    /**
     * @param portalNoticeDTO
     * @return org.fzzn.core.model.msg.Message<com.hb.core.pojo.portal.dto.PortalNoticeDTO>
     * @Description: 门户查询公告详情
     * @author yuezheng
     * @date 2022/5/26 15:14
     */
    @Override
    public PortalNoticeDTO findNoticeById(PortalNoticeDTO portalNoticeDTO) {
        PortalNoticeDTO result = new PortalNoticeDTO();

        QueryWrapper<PortalNotice> noticeQuery = new QueryWrapper<>();
        noticeQuery.lambda().select(PortalNotice::getId, PortalNotice::getNoticeType, PortalNotice::getProjectType,PortalNotice::getSignEndTime,
                        PortalNotice::getNoticeTitle, PortalNotice::getCityName, PortalNotice::getOpenBidTime, PortalNotice::getNoticeTitle,
                        PortalNotice::getDeployTime, PortalNotice::getAreaName, PortalNotice::getBidWay, PortalNotice::getClickCount,
                        PortalNotice::getProjectName, PortalNotice::getProvinceName, PortalNotice::getOrgName, PortalNotice::getProjectId, PortalNotice::getNoticeNature,
                        PortalNotice::getNoticeContentFile, PortalNotice::getAttachments, PortalNotice::getReceiveType)
                .eq(PortalNotice::getId, portalNoticeDTO.getId())
                .eq(PortalNotice::getDeleteFlag, 0);
        PortalNotice portalNotice = baseMapper.selectOne(noticeQuery);
        Integer clickCount = portalNotice.getClickCount();
        clickCount += 1;
        portalNotice.setClickCount(clickCount);
        baseMapper.updateById(portalNotice);
        BeanUtil.copyProperties(portalNotice, result, true);

        // 查询内容
        QueryWrapper<PortalNoticeContent> contentQuery = new QueryWrapper<>();
        contentQuery.lambda().select(PortalNoticeContent::getNoviceContent).eq(PortalNoticeContent::getPortalNoticeId, portalNotice.getId());
        // 查询附件
        QueryWrapper<PortalNoticeFile> fileQuery = new QueryWrapper<>();
        fileQuery.lambda().select(PortalNoticeFile::getId, PortalNoticeFile::getFileName, PortalNoticeFile::getFilePath)
                .eq(PortalNoticeFile::getPortalNoticeId, portalNotice.getId());

        PortalNoticeContent portalNoticeContent = portalNoticeContentMapper.selectOne(contentQuery);
        List<PortalNoticeFile> portalNoticeFiles = portalNoticeFileMapper.selectList(fileQuery);

        if (!BeanUtil.isEmpty(portalNoticeContent)) {
            result.setNoviceContent(portalNoticeContent.getNoviceContent());
        }

        if (!CollUtil.isEmpty(portalNoticeFiles)) {
            result.setPortalNoticeFileList(portalNoticeFiles);
        }
        return result;
    }

    /**
     * @param portalNoticeDTO
     * @return org.fzzn.core.model.msg.Message<java.util.List < com.hb.core.pojo.portal.entity.PortalNotice>>
     * @Description: 查询公告列表
     * 门户查询相关公告
     * @author yuezheng
     * @date 2022/5/26 16:04
     */
    @Override
    public List<PortalNotice> listPortalNotice(PortalNoticeDTO portalNoticeDTO) {
        // projectId 为空说明是后台手动添加的公告
        List<PortalNotice> portalNoticeList = new ArrayList<>();
        if(StrUtil.isEmpty(portalNoticeDTO.getProjectId())){
            return portalNoticeList;
        }
        QueryWrapper<PortalNotice> queryWrapper = new QueryWrapper<>();
        LambdaQueryWrapper<PortalNotice> lambda = queryWrapper.lambda();
        lambda.select(PortalNotice::getId, PortalNotice::getNoticeTitle)
                .eq(PortalNotice::getProjectId, portalNoticeDTO.getProjectId())
                .eq(PortalNotice::getDeleteFlag, 0);
        if(StrUtil.isNotEmpty(portalNoticeDTO.getReceiveType())){
            lambda.eq(PortalNotice::getReceiveType, portalNoticeDTO.getReceiveType());
        }
        if(null != portalNoticeDTO.getId()){
            lambda.ne(PortalNotice::getId, portalNoticeDTO.getId());
        }

        lambda.orderByDesc(PortalNotice::getDeployTime);
        return baseMapper.selectList(queryWrapper);
    }


    /**
     * 查询公告推送信息
     *
     * @param portalNoticeDTO
     * @return org.fzzn.core.model.msg.Message<java.util.List < com.hb.core.pojo.portal.entity.PortalNotice>>
     * @author tian
     * @date 2022-5-26 16:16
     */
    @Override
    public List<PortalNoticeDTO> listPortalNoticeByPushStatus(PortalNoticeDTO portalNoticeDTO) {
        List<PortalNoticeDTO> portalNoticeDTOS = baseMapper.listPortalNoticeByPushStatus(portalNoticeDTO);
        QueryWrapper<PortalNoticeFile> fileQuery;

        if (CollUtil.isNotEmpty(portalNoticeDTOS)) {
            // 查询附件信息
            for (PortalNoticeDTO portalNotice : portalNoticeDTOS) {
                fileQuery = new QueryWrapper<>();
                fileQuery.lambda().select(PortalNoticeFile::getId, PortalNoticeFile::getFileName, PortalNoticeFile::getFilePath)
                        .eq(PortalNoticeFile::getPortalNoticeId, portalNotice.getId());
                List<PortalNoticeFile> portalNoticeFiles = portalNoticeFileMapper.selectList(fileQuery);
                portalNotice.setPortalNoticeFileList(portalNoticeFiles);
            }
        }
        return portalNoticeDTOS;
    }

    /**
     * 标记推送状态为已推送
     *
     * @param ids 待修改推送状态的ids
     * @return org.fzzn.core.model.msg.Message<java.util.List < com.hb.core.pojo.portal.entity.PortalNotice>>
     * @author tian
     * @date 2022-5-26 16:20
     */
    @Override
    public Boolean updatePushStatusByIds(List<Long> ids) {
        Integer num = baseMapper.updatePushStatusByIds(ids);
        return num > 0 ? true : false;
    }

    @Override
    public PageResult<PortalNoticeDTO> pagePortalNoticeList4Manager(PortalNoticeDTO portalNoticeDTO) {
        Page<PortalNoticeDTO> pages = portalNoticeDTO.pages();
        Page<PortalNoticeDTO> page = null;

        SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        try {
            if (null != portalNoticeDTO.getPublishStartDate()) {
                Date publishStartDate = simpleDateFormat.parse(sim.format(portalNoticeDTO.getPublishStartDate()) + " 00:00:00");
                portalNoticeDTO.setPublishStartDate(publishStartDate);
            }
            if (null != portalNoticeDTO.getPublishEndDate()) {
                Date publishEndDate = simpleDateFormat.parse(sim.format(portalNoticeDTO.getPublishEndDate()) + " 23:59:59");
                portalNoticeDTO.setPublishEndDate(publishEndDate);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        page = baseMapper.listNotice4Manager(pages, portalNoticeDTO);

        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        List<PortalNoticeDTO> result = page.getRecords().stream().map(item -> {
            PortalNoticeDTO dto = new PortalNoticeDTO();
            BeanUtil.copyProperties(item, dto);

            LocalDateTime deployTime = dto.getDeployTime();
            if (deployTime != null){
                String deployTimeStr = deployTime.format(fmt);
                dto.setDeployTimeStr(deployTimeStr);
            }
            if (item.getOpenBidTime() != null) {
                if (DateUtil.getMillis2() > item.getOpenBidTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()) {
                    dto.setApplyStatus(2);
                } else {
                    dto.setApplyStatus(1);
                }
            }
            return dto;
        }).collect(Collectors.toList());
        page.setRecords(result);

        if (CollUtil.isNotEmpty(page.getRecords())){
            return PageResult.get(page);
        }

        return PageResult.get(page);
    }

    @Override
    public void delPortalNotice(PortalNoticeDTO portalNoticeDTO) {
        Long id = portalNoticeDTO.getId();

        baseMapper.delPortalNotice(id);


    }

    /**
     * 新增/编辑公告
     * 保存通用接口
     *
     * @param portalNoticeDTO
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void savePortalNotice4Manager(PortalNoticeDTO portalNoticeDTO) {
        PortalNotice portalNotice = new PortalNotice();
        portalNoticeDTO.to(portalNotice);

        // 每次保存前清空旧数据
        Long oldId = portalNotice.getId();
        if (oldId != null){
            baseMapper.deleteById(oldId);

            Map delMap = new HashMap();
            delMap.put("portal_notice_id", oldId);

            portalNoticeContentMapper.deleteByMap(delMap);
            portalNoticeFileMapper.deleteByMap(delMap);
        }

        // 保存公告信息
        Long portalNoticeId = IdUtil.getId();
        portalNotice.setId(portalNoticeId);
        baseMapper.insert(portalNotice);

        // 保存公告内容
        PortalNoticeContent portalNoticeContent = new PortalNoticeContent();
        portalNoticeContent.setId(IdUtil.getId());
        portalNoticeContent.setPortalNoticeId(portalNoticeId);
        portalNoticeContent.setNoviceContent(portalNoticeDTO.getNoviceContent());
        portalNoticeContentMapper.insert(portalNoticeContent);


        // 保存公告附件
        if (CollUtil.isNotEmpty(portalNoticeDTO.getPortalNoticeFileList())) {
            for (PortalNoticeFile portalNoticeFile : portalNoticeDTO.getPortalNoticeFileList()) {
                portalNoticeFile.setId(IdUtil.getId());
                portalNoticeFile.setPortalNoticeId(portalNoticeId);

                portalNoticeFileMapper.insert(portalNoticeFile);
            }
        }
    }

}
